package xml;

import org.jdom.*;

import start.Config;

import java.util.ArrayList;
import java.util.List;
import java.io.File;
import java.io.IOException;

/**
 * XML-Saver zum Speichern von Kategorien in XML-Files
 * @author Dennis Wittkoetter
 * @version 1.0
 */
public class XMLCategorySaver extends XML {
	
	/**
	 * Konstruiert eine leere XML-Datei
	 * @param file	Name der anzulegenden Datei
	 * @throws IOException Eingabe Ausgabe Fehler
	 * @throws JDOMException XML spezifischer Fehler
	 */
	public XMLCategorySaver(File file) throws JDOMException, IOException {
		super(file);
	}
	
	/**
	 * Haengt ein Element der Kategorie "name" an den XML-Baum an
	 * @param s	Name der einzufuegenden Kategorie
	 * @return	'true' wenn Eintrag noch nicht vorhanden, 
	 * 			'false' wenn Eintrag bereits exisistiert
	 * @throws IOException Eingabe Ausgabe Fehler
	 * @throws JDOMException XML spezifischer Fehler
	 */
	public boolean add(String s) throws IOException, JDOMException {	
		if (this.getIndex(s) != -1 || s.isEmpty())
			return false;
		
		root.addContent(new Element("name").setText(s));
		return true;
	}
	
	/**
	 * Liefert den Index eine bestimmten Kategoerie
	 * @param s	Name der gesuchten Kategorie
	 * @return	Indexposition der Kategorie im XML-Tree,
	 * 			'-1' falls Kategorie nicht gefunden wurde
	 */
	@SuppressWarnings("unchecked")
	public int getIndex(String s) {
		List<Element>componentList = new ArrayList<Element>();
		componentList = (List<Element>)root.getChildren("name");
		
		int i=0;
		for (Element comp : componentList) {			
			if (comp.getText().equalsIgnoreCase(s))
				return i;	//Indexposition des gesuchten Elements
			i++;
		}
		return -1;	//DEFAULT
	}
	
	/**
	 * Entfernt die Elemente mit dem angegebenen Namen
	 * @param s	Name des zu entfernenden XML-Eintrags
	 * @throws IOException Eingabe Ausgabe Fehler
	 * @throws JDOMException XML spezifischer Fehler
	 */
	@SuppressWarnings("unchecked")
	public void remove(String s) throws IOException, JDOMException {
		List<Element>componentList = new ArrayList<Element>();		//neue Liste fuer XML-Elemente anlegen
		componentList = (List<Element>)root.getChildren("name");	//alle Children der Wurzel in Liste schreiben zur Bearbeitung 
		
		if (Config.debugMode())	System.out.println("Index: "+getIndex(s));
	
		componentList.remove(getIndex(s));	//Indexpos. des zu entfernenden Elements in XML ermitteln und aus Liste loeschen
		update();							//Wurzel aktualisieren
		root.removeContent();				//und alle Child-Elemente entfernen = XML leer
		
		for (Element comp : componentList) {
			add(comp.getText());			//neuen Listeninhalt in XML schreiben
		}
	}	
	
	/**
	 * Benennt eine Kategorie um.
	 * @param oldName	Alter Kategoriename
	 * @param newName	Neuer Kategoriename
	 * @return	'true' wenn Umbenennen erfolgreich, 'false' wenn nicht
	 * @throws IOException Eingabe Ausgabe Fehler
	 * @throws JDOMException XML spezifischer Fehler
	 */
	public boolean rename(String oldName, String newName) throws JDOMException, IOException {
		int index = getIndex(oldName);
		
		if (index < 0)	return false;

		root.addContent(index, new Element("name").setText(newName));	
		return true;
	}
}
